﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Reflection;
using System.Data;
using System.Data.Objects;
using System.Data.SqlClient;
using System.Diagnostics;
using PrvDataModel;
using System.Data.EntityClient;

namespace PRV_BO.Domain
{
    public class PresenterPRV
    {
        enum ChartQueryEnum
        {
            PrimerRangoPotrero = 1,
            RestoRangosPotrero = 2
        }

        private static PotrerosCollection _allPotreros;
        private static RotacionesCollection _allRotaciones;

        #region BO operations

        public DateTime GetUltFechaSalida(RotacionesCollection RC)
        {
            DateTime dt = (DateTime)RC.Max(R => R.FechaSalida);
            return dt;
        }

        public DateTime GetUltFechaEntrada()
        {
            RotacionesCollection RC = GetRotaciones();
            DateTime dt = (DateTime)RC.Max(R => R.FechaEntrada);
            return dt;
        }

        public void MoverLote(RotArgs rArgs)
        {
			DateTime minDt = DateTime.Parse("1900-01-01");
            RotacionesCollection rotsOcupado = PresenterPRV.GetRotaciones(rArgs.PotreroOcupado,true);

            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                if ((rotsOcupado.Count > 0) && (rArgs.PotreroOcupado.Trim() != string.Empty))
                {
                    var rot = context.Rotaciones.FirstOrDefault(R => (R.NombrePotrero == rArgs.PotreroOcupado && (R.FechaSalida == minDt || R.FechaSalida == null)));
                    if (rot != null)
                    {
						DateTime mindt = DateTime.Parse("1900-01-01");
                        rot.FechaSalida = rArgs.FechaMvto;
                        rot.Lote = rArgs.lote;
                    }
                }

                if (rArgs.PotreroaOcupar != string.Empty)
                {
                    Int32 maxId = (Int32)context.Rotaciones.Max(r2 => r2.IDR) + 1;

                    var rot2 = new Rotacione();
                    rot2.NombrePotrero = rArgs.PotreroaOcupar;
                    rot2.FechaEntrada = rArgs.FechaMvto;
                    rot2.IDR = maxId;
                    // Rotacione.CreateRotacion(rArgs.PotreroaOcupar, rArgs.FechaMvto, maxId);
					rot2.FechaSalida = DateTime.Parse("1900-01-01");
                    rot2.Lote = rArgs.lote;
                    context.Rotaciones.Add(rot2);
                }

                context.SaveChanges();

                if (!string.IsNullOrEmpty(rArgs.comm))
                {
                    Int32 nextid = context.Comentarios.Max(wp => wp.IDC) + 1;
                    var coment = new Comentario() { Fecha = rArgs.FechaMvto, Texto = rArgs.comm, IDC = nextid };
                    coment.NombrePotrero = (rArgs.PotreroaOcupar.Trim() != string.Empty) ? rArgs.PotreroaOcupar : rArgs.PotreroOcupado;
                    context.Comentarios.Add(coment);
                    context.SaveChanges();
                }
            }
        }

        public static void ResetAllPotrerosCache()
        {
            _allPotreros = null;
        }

        public static void ReplacePotreroOnCache(PotreroBO pbo)
        {
            var dpbo = _allPotreros.Where(wp => wp.NombrePotrero == pbo.NombrePotrero).First();
            _allPotreros.Remove(dpbo);
            _allPotreros.Add(pbo);
        }

        public static PotrerosCollection allPotreros()
        {
            if (_allPotreros == null)
            { _allPotreros = GetPotreros(); }

            return _allPotreros;
        }

        public static void ActualizarRotacionesDePotrerosQueRotaron(string desde, string hacia, bool filtrarRotaciones)
        {
            PotrerosCollection pC = new PotrerosCollection();

            if (desde.Trim() != string.Empty)
            {
                var pot = PresenterPRV.GetPotreroByName(desde);
                pot.Rotaciones = PresenterPRV.GetRotaciones(desde, false);
                pC.Add(pot); 
            }

            if (hacia.Trim() != string.Empty)
            {
                var pot = PresenterPRV.GetPotreroByName(hacia);
                pot.Rotaciones = PresenterPRV.GetRotaciones(hacia, false);
                pC.Add(pot);
            }

            PresenterPRV.AplicarFiltroAListaDeRotaciones(pC, filtrarRotaciones);

            // Actualizar lista de todos los potreros con informacion de los que cambiaron
            foreach (PotreroBO pbo in pC)
            {
                PresenterPRV.ReplacePotreroOnCache(pbo);
            }
        }

        public static void AplicarFiltroAListaDeRotaciones(PotrerosCollection pC, bool FiltrarRotaciones)
        {
            foreach (PotreroBO pbo in pC)
            {
                {
                    // Si el filtro es removido, se lee de la base de datos. Sino, se filtran registros en memoria
                    pbo.Rotaciones = FiltrarRotaciones ?
                        PresenterPRV.RotacionesFiltradas(pbo) :
                      (RotacionesCollection)PresenterPRV.GetRotaciones(pbo.NombrePotrero);
                }
            }
        }

        public static PotrerosCollection VaciosPorArea(PotrerosCollection qVacios, string area)
        {
            return new PotrerosCollection(qVacios.Where(wp => wp.Area.Contains(area)).ToList());
        }

        public static PotrerosCollection PotrerosVacios(PotrerosCollection allPotreros)
        {
            return new PotrerosCollection(allPotreros.Where(wp => !wp.Ocupado).OrderBy(wp => wp.NombrePotrero).ToList());
        }

        public static PotrerosCollection PotrerosVacios()
        {
            return new PotrerosCollection(allPotreros().Where(wp => !wp.Ocupado).OrderBy(wp => wp.NombrePotrero).ToList());
        }

        public static PotrerosCollection PotrerosOcupados(PotrerosCollection allPotreros)
        {
            return new PotrerosCollection(allPotreros.Where(wp => wp.Ocupado).OrderBy(wp => wp.FechaUltimaEntrada).ToList());
        }

        public static PotrerosCollection PotrerosOcupados()
        {
            PotrerosCollection pc = new PotrerosCollection();
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
				DateTime mindt = DateTime.Parse("1900-01-01");
                var rots = context.Rotaciones.Where(wp => wp.FechaSalida == mindt).OrderBy(wp=>wp.NombrePotrero);
                foreach (var rot in rots)
                {
                    var pot = GetPotreroByName(rot.NombrePotrero);
                    pot.Rotaciones = PresenterPRV.GetRotaciones(pot.NombrePotrero, false);
                    pc.Add(pot);
                }

                return pc;
            }
        }

        public static IEnumerable<string> ListaDeAreas(PotrerosCollection allPotreros)
        {
            return allPotreros.OrderBy(w => w.Area).Select(wp => wp.Area).Distinct();
        }

        public static RotacionesCollection RotacionesFiltradas(PotreroBO pbo)
        {
            return new RotacionesCollection(pbo.Rotaciones.Where(wp => wp.FechaEntrada > DateTime.Now.AddDays(-365)).ToList());
        }

        internal static int DiasReposo(string NombrePotrero,DateTime? FechaEntrada,DateTime? FechaSalida)
        {
            DateTime? siguienteOcupacion = DateTime.Now;
            int dias;

            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var q = context.Rotaciones.
                    Where(wp => (wp.NombrePotrero == NombrePotrero) && wp.FechaEntrada > FechaEntrada).OrderBy(wp => wp.FechaEntrada);
                siguienteOcupacion = (q.Count() == 0 ? siguienteOcupacion : q.Min(wp => wp.FechaEntrada));
                dias = (short)((TimeSpan)(siguienteOcupacion - FechaSalida)).Days;
            }

            return dias;

        }

        #endregion BO Operations

        #region DB Operations

        public static PotrerosCollection GetPotreros()
        {
            PotrerosCollection blp = new PotrerosCollection();

            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                foreach (Potrero p in context.Potreros.OrderBy(p => p.NombrePotrero))
                {
                    PotreroBO pbo = new PotreroBO(blp, p.NombrePotrero,p.Area);
                    blp.Add(pbo);
                }
            }
            return blp;

            //var z = from p in PRV.Data.Potrero.All()
            //        orderby p.NombrePotrero
            //        select new PotreroBO(blp, p);
            //return new PotrerosCollection(z.ToList());
        }

        public static PotreroBO GetPotreroByName(string nombrePotrero)
        {
            PotreroBO pBo = new PotreroBO();
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var pot = context.Potreros.FirstOrDefault(wp => wp.NombrePotrero == nombrePotrero);
                if (pot != null)
                {
                    pBo = new PotreroBO(pot.NombrePotrero,pot.Area);
                }
            }

            return pBo;
        }

        public RotacionesCollection GetRotacionesFiltradasFromDB()
        {
            RotacionesCollection RC = new RotacionesCollection();
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var pots = context.Rotaciones.Where(wp => wp.FechaEntrada > DateTime.Now.AddDays(-365)).OrderBy(wp => wp.FechaEntrada);
                foreach (var r in pots)
                {
                    RotacionBO rbo = new RotacionBO(RC,r.NombrePotrero,r.FechaEntrada,r.FechaSalida,r.Lote,r.IDR);
                    RC.Add(rbo);
                }
            }
            return RC;
        }

        public static RotacionesCollection GetRotaciones()
        {
            RotacionesCollection RC = new RotacionesCollection();
            if (_allRotaciones == null)
            {
                using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
                {
                    var pots = context.Rotaciones.OrderBy(wp => wp.FechaEntrada);
                    foreach (var r in pots)
                    {
                        RotacionBO rbo = new RotacionBO(RC, r.NombrePotrero, r.FechaEntrada, r.FechaSalida, r.Lote, r.IDR);
                        RC.Add(rbo);
                    }
                }

                _allRotaciones = RC;
            }
            else
            {
                RC = _allRotaciones;
            }

            //var z = from p in PRV.Data.Rotacione.All()
            //        orderby p.FechaEntrada
            //        select new RotacionBO(RC, p);

            //return new RotacionesCollection(z.ToList());

            return RC;
        }

        public RotacionDOCollection GetChartLabels(int rangoDias, string area)
        {
            RotacionDOCollection rc = new RotacionDOCollection();
            RotacionDO rbo;
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                DateTime dt = System.DateTime.Now.AddDays(rangoDias * -1);
				DateTime minDT = DateTime.Parse("1900-01-01");
                var q = from r in context.Rotaciones
                        join pot in context.Potreros on r.NombrePotrero equals pot.NombrePotrero
                        where r.FechaEntrada > dt && pot.Area.ToUpper() == area.ToUpper()
                        orderby r.NombrePotrero, r.FechaEntrada
                        group r by r.NombrePotrero;

                foreach (var group in q)
                {
                    try
                    {
                        rbo = new RotacionDO();
                        rbo.NombrePotrero = group.Key;
                        rbo.FechaEntrada = group.Min(wp => wp.FechaEntrada);
                        DateTime? mdt = (group.Where(w => w.FechaSalida > DateTime.Parse("1900-01-01")).Min(wp => wp.FechaSalida));
                        rbo.FechaSalida = (DateTime)((mdt == null || mdt == minDT) ? System.DateTime.Now : mdt);
                        rc.Add(rbo);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

                return rc;
            }
        }

        public RotacionDOCollection GetChartData(int rangoDias, string area)
        {
            //            string SQL = BuildChartQuery(ChartQueryEnum.RestoRangosPotrero, rangoDias, area);
            //            return GetRotacionesChart(SQL);
            RotacionDOCollection rc = new RotacionDOCollection();
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                DateTime dt = System.DateTime.Now.AddDays(rangoDias * -1);
                var q = from r in context.Rotaciones
                        join pot in context.Potreros on r.NombrePotrero equals pot.NombrePotrero
                        where r.FechaEntrada > dt && pot.Area.ToUpper() == area.ToUpper()
                        orderby r.NombrePotrero, r.FechaEntrada
                        group r by r.NombrePotrero;

                foreach (var group in q)
                {
                    RotacionDO rbo = new RotacionDO();
                    var q2 = group.Skip(1);
                    foreach (var set2 in group)
                    {
                        rbo.NombrePotrero = set2.NombrePotrero;
                        rbo.FechaEntrada = set2.FechaEntrada;
                        rbo.FechaSalida = (System.DateTime)set2.FechaSalida;
						if (rbo.FechaSalida == DateTime.Parse("1900-01-01"))
                        {
                            rbo.FechaSalida = System.DateTime.Now;
                        }
                        rc.Add(rbo);
                    }
                    //string SQL = BuildChartQuery(ChartQueryEnum.PrimerRangoPotrero, rangoDias, area);
                    //return GetRotacionesChart(SQL);
                }
            }
            return rc;
        }

        private RotacionesCollection GetRotacionesChart(string SQL)
        {
            RotacionesCollection rc = new RotacionesCollection();
            using (SqlConnection conn = new SqlConnection(GetConnectionString("PRVDB")))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(SQL, conn);
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    RotacionBO rbo = new RotacionBO(rc);
                    rbo.NombrePotrero = dr[0].ToString();   // 0 = Nombre Potrero
                    rbo.FechaEntrada = Convert.ToDateTime(dr[1]);
                    rbo.FechaSalida = Convert.ToDateTime(dr[2]);
					if (rbo.FechaSalida == DateTime.Parse("1900-01-01"))
                    {
                        rbo.FechaSalida = System.DateTime.Now;
                    }
                    rc.Add(rbo);
                }

                conn.Close();

                return rc;

            }

        }

        public static RotacionesCollection GetRotaciones(string nombrePotrero, bool fromCache = true)
        {

            RotacionesCollection RC = new RotacionesCollection();

            if (fromCache)
            {
                RC = new RotacionesCollection(GetRotaciones().Where(wp => wp.NombrePotrero == nombrePotrero).ToList());
            }
            else
            {
                using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
                {
                    foreach (var r in context.Rotaciones.Where(q => (q.NombrePotrero == nombrePotrero)).OrderBy(pw => pw.FechaEntrada))
                    {
                        RotacionBO rbo = new RotacionBO(RC, r.NombrePotrero, r.FechaEntrada, r.FechaSalida, r.Lote, r.IDR);
                        RC.Add(rbo);
                    }
                }
            }

            return RC;
        }

        public DateTime GetFechaUltimaEntrada(string nombrePotrero)
        {
            DateTime dt = Convert.ToDateTime("1900-01-01");
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                return context.Rotaciones.Where(wp => (wp.NombrePotrero == nombrePotrero)).Max(w => w.FechaEntrada);
            }

        }

        public bool ValidarMovimiento(RotArgs rArgs, ref string Message)
        {
            Message = string.Empty;

            if ((rArgs.PotreroaOcupar.Trim() == string.Empty) && (rArgs.PotreroOcupado.Trim() == string.Empty))
            {
                Message = "Al menos un potrero es requerido en la operacion";
                return false;
            }

            if (rArgs.FechaMvto > System.DateTime.Now.AddDays(1) || (rArgs.FechaMvto < System.DateTime.Now.AddDays(-180)))
            {
                Message = "la Fecha del movimiento NO puede ser en el futuro o anterior a 6 meses.";
                return false;
            }

            if ((rArgs.PotreroOcupado.Trim() != string.Empty) &&
                GetFechaUltimaEntrada(rArgs.PotreroOcupado) > rArgs.FechaMvto)
            {
                Message = "la Fecha del movimiento debe ser posterior a la fecha de entrada en el potrero ocupado.";
                return false;
            }

            if (rArgs.PotreroOcupado.Trim() == string.Empty)
            {
                Message = "Nota: operacion corresponde a nuevo lote/compra/correccion";
            }

            if (rArgs.PotreroaOcupar.Trim() == string.Empty)
            {
                Message = "Nota: operacion corresponde a venta/correccion";
            }


            return true;

        }

        public bool IsNewRotacionValid(RotacionesCollection RC, string nombrePotrero, DateTime FechaEntrada, DateTime FechaSalida)
        {
            return !RC.Any(wp =>
                          (wp.NombrePotrero == nombrePotrero) &&
                          ((wp.FechaEntrada < FechaEntrada) && (wp.FechaSalida > FechaEntrada)) ||
                          ((wp.FechaEntrada < FechaSalida) && (wp.FechaSalida > FechaSalida)));

        }

        public static ComentariosCollection GetComentarios()
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                ComentariosCollection cc = new ComentariosCollection();
                foreach (Comentario p in context.Comentarios.OrderBy(p => p.Fecha))
                {
                    ComentarioBO pbo = new ComentarioBO(p.IDC,p.NombrePotrero,p.Fecha,p.Texto);
                    cc.Add(pbo);
                }

                return cc;
            }
            //var z = from p in PRV.Data.Comentario.All()
            //        orderby p.Fecha
            //        select new ComentarioBO(p);

            //if (z.Count() > 0)
            //{
            //    cc = new ComentariosCollection(z.ToList());
            //}

            //return cc;
        }

        public PotrerosCollection GetPotrerosOcupados(PotrerosCollection allPotreros)
        {

            PotrerosCollection PC = new PotrerosCollection();

            var q = from c in allPotreros
                    where c.Ocupado == true
                    orderby c.FechaUltimaEntrada
                    select new PotreroBO(PC);

            return new PotrerosCollection(allPotreros
                                          .Where(wp => wp.Ocupado)
                                          .OrderBy(wp => wp.FechaUltimaEntrada)
                                          .ToList());
        }

        public PotrerosCollection GetPotrerosOcupados()
        {
			DateTime dt = DateTime.Parse("1900-01-01");
            PotrerosCollection pc = new PotrerosCollection();
            List<string> ocupados = new List<string>();
 
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                ocupados = context.Rotaciones.Where(wp => wp.FechaSalida == dt).Select(wq => wq.NombrePotrero).ToList();
            }

            foreach (string np in ocupados)
            {
                pc.Add(GetPotreroByName(np));
            }

            return pc;
        }

        public void DeletePotrero(string nombrePotrero)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var pot = context.Potreros.First(p => p.NombrePotrero == nombrePotrero);
                context.Set<Potrero>().Remove(pot);
                context.SaveChanges();
            }
        }

        public void DeleteRotacion(Int32 iD)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var rot = context.Rotaciones.First(p => p.IDR == iD);
                context.Set<Rotacione>().Remove(rot);
                context.SaveChanges();
            }
        }

        public void DeleteComentario(Int32 iD)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var rot = context.Comentarios.First(p => p.IDC == iD);
                context.Set<Comentario>().Remove(rot);
                context.SaveChanges();
            }
        }

        public void GuardarPotrero(PotreroBO pot)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                if (pot.IsNew)
                {
                    var p1 = new Potrero() { NombrePotrero = pot.NombrePotrero };
                    p1.Area = pot.Area;
                    context.Potreros.Add(p1);
                }
                else
                {
                    var p2 = context.Potreros.FirstOrDefault(wp => wp.NombrePotrero == pot.NombrePotrero);
                    if (p2 != null)
                    { p2.Area = pot.Area; }
                }

                context.SaveChanges();
            }
        }

        public void GuardarPotrero(PotrerosCollection pC)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {

                foreach (PotreroBO pot in pC)
                {
                    if (pot.IsNew)
                    {
                        var p1 = new Potrero() { NombrePotrero = pot.NombrePotrero };
                        p1.Area = pot.Area;
                        context.Potreros.Add(p1);
                    }
                    else
                    {
                        var p2 = context.Potreros.FirstOrDefault(wp => wp.NombrePotrero == pot.NombrePotrero);
                        if (p2 != null)
                        { p2.Area = pot.Area; }
                    }
                }

                context.SaveChanges();
            }
        }

        public void GuardarRotacion(RotacionesCollection rC)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {

                foreach (var rbo in rC)
                {
                    if (rbo.IsNew)
                    {
                        Int32 maxId = (Int32)context.Rotaciones.Max(r2 => r2.IDR) + 1;
                        var p1 = new Rotacione() {NombrePotrero = rbo.NombrePotrero, FechaEntrada = (DateTime)rbo.FechaEntrada, IDR = maxId};
                        p1.FechaSalida = rbo.FechaSalida;
                        p1.Lote = rbo.Lote;
                        context.Rotaciones.Add(p1);
                    }
                    else
                    {
                        var p2 = context.Rotaciones.FirstOrDefault(wp => wp.IDR == rbo.ID);
                        if (p2 != null)
                        {
                            CopyProperties(rbo, p2, null);
                        }
                    }
                }

                context.SaveChanges();
            }
        }

        public void GuardarComentario(ComentariosCollection cC)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                foreach (ComentarioBO rbo in cC)
                {
                    if (rbo.IsNew)
                    {
                        Int32 maxId = context.Comentarios.Max(wp => wp.IDC) + 1;
                        var coment = new Comentario () { Fecha = rbo.Fecha, Texto = rbo.Comentario, IDC = maxId };
                        coment.NombrePotrero = rbo.NombrePotrero;
                        context.Comentarios.Add(coment);
                        context.SaveChanges();
                    }
                    else
                    {
                        var com = context.Comentarios.FirstOrDefault(wp => wp.IDC == rbo.ID);
                        com.Texto = rbo.Comentario;
                    }

                    context.SaveChanges();
                }
            }
        }

        public void CrearComentario(ComentarioBO rbo)
        {
            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                Int32 maxId = context.Comentarios.Max(wp => wp.IDC) + 1;
                var coment = new Comentario() { Fecha = rbo.Fecha, Texto = rbo.Comentario, IDC = maxId };
                coment.NombrePotrero = rbo.NombrePotrero;
                context.SaveChanges();
            }
        }

        public static bool AddPotrero(PotreroBO pbo)
        {
            try
            {

            using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
            {
                var p1 = new Potrero();
                p1.NombrePotrero = pbo.NombrePotrero;
                p1.Area = pbo.Area;
                context.Potreros.Add(p1);

                return context.SaveChanges() > 0;
            }
            }
            catch (Exception)
            {
                //TODO: Log this error
                return false;
            }
        }

        #endregion


        public static bool UpdatePotrero(PotreroBO pot)
        {
            try
            {
                using (var context = new prvCEEntities(ConfigUtils.GetEFConnection("PRVCEEntities")))
                {

                    var p2 = context.Potreros.FirstOrDefault(wp => wp.NombrePotrero == pot.NombrePotrero);
                    if (p2 != null)
                    {
                        p2.Area = pot.Area;
                    }

                    return context.SaveChanges() > 0;
                }

            }
            catch (Exception)
            {
                //TODO: Log this error
                return false;
            }

        }
		private  static string GetConnectionString(string connectionName)
		{
			return System.Configuration.ConfigurationManager.ConnectionStrings[connectionName].ToString();
		}

		private static void CopyProperties(object objFrom, object objTo, string[] ExcludeProperties)
		{
			foreach (System.Reflection.PropertyInfo oProperty in objFrom.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
			{
				if ((ExcludeProperties == null) || !ExcludeProperties.Contains(oProperty.Name))
				{
					System.Reflection.PropertyInfo oNewProperty = objTo.GetType().GetProperty(oProperty.Name);
					if (oNewProperty != null && oNewProperty.CanWrite)
					{
						oNewProperty.SetValue(objTo, oProperty.GetValue(objFrom, null), null);
					}
				}
			}
		}


    }
}